<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:lxslt="http://xml.apache.org/xslt"
                xmlns:redirect="http://xml.apache.org/xalan/redirect"
                extension-element-prefixes="redirect">

    <xsl:output method="html" indent="yes" encoding="UTF-8"/>
    <xsl:decimal-format decimal-separator="." grouping-separator=","/>

    <xsl:param name="output.dir" select="'.'"/>

    <xsl:include href="./stylesheet.xsl" />
    <xsl:include href="./summary.xsl" />
    <xsl:include href="./allfiles.xsl" />
    <xsl:include href="./allerrors.xsl"/>

    <xsl:include href="./process-checktype.xsl" />
    <xsl:include href="./process-folder.xsl"/>
    <xsl:include href="./process-file.xsl" />
    <xsl:include href="./process-error.xsl"/>

    <xsl:template match="checkstyle">
        <!-- create the index.html -->
        <redirect:write file="{$output.dir}/index.html">
            <xsl:call-template name="index.html"/>
        </redirect:write>

        <!-- create the stylesheet.css -->
        <redirect:write file="{$output.dir}/stylesheet.css">
            <xsl:call-template name="stylesheet.css"/>
        </redirect:write>

        <!-- create the overview-summary.html at the root -->
        <redirect:write file="{$output.dir}/summary.html">
            <xsl:apply-templates select="." mode="summary"/>
        </redirect:write>

        <!-- create the all-classes.html at the root -->
        <redirect:write file="{$output.dir}/allfiles.html">
            <xsl:apply-templates select="." mode="all.files"/>
        </redirect:write>

        <!-- create the all-classes.html at the root -->
        <redirect:write file="{$output.dir}/allerrors.html">
            <xsl:apply-templates select="." mode="all.errors"/>
        </redirect:write>

        <!-- process all files -->
        <xsl:apply-templates select="checktype"/>
    </xsl:template>

    <xsl:template name="index.html">
        <html>
            <head>
                <title>Devexperts CheckStyle Audit</title>
            </head>
            <frameset cols="20%,80%">
                <frameset rows="60%,40%">
                    <frame src="allerrors.html" name="listErrorsFrame"/>
                    <frame src="allfiles.html" name="listFilesFrame"/>
                </frameset>
                <frame src="summary.html" name="mainFrame"/>
            </frameset>
            <noframes>
                <h2>Frame Alert</h2>
                <p>
                    This document is designed to be viewed using the frames feature. If you see this message, you are
                    using a non-frame-capable web client.
                </p>
            </noframes>
        </html>
    </xsl:template>

    <xsl:template name="pageHeader">
        <table border="0" cellpadding="0" cellspacing="0" width="100%">
            <tr>
                <td class="text-align:right">
                    <h2>Devexperts CheckStyle Audit</h2>
                </td>
            </tr>
            <tr>
                <td class="text-align:right">Designed for use with
                    <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and <a href='http://jakarta.apache.org'>Ant</a>.
                    Reporter library is developed by Devexperts.
                </td>
            </tr>
        </table>
        <hr size="1"/>
    </xsl:template>

    <!--
    Replace DOS characters in a path.
    Replace '\' with '/', ':' with '_'.
    -->
    <xsl:template name="from-dos">
        <xsl:param name="path"/>
        <xsl:value-of select="translate($path, '\:', '/_')"/>
    </xsl:template>

    <xsl:template match="checkstyle" mode="filelist">
        <h3>Files</h3>
        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
            <tr>
                <th>Name</th>
                <th>Errors</th>
            </tr>
            <xsl:apply-templates select="file" mode="filelist">
                <xsl:sort select="@name"/>
            </xsl:apply-templates>
        </table>
    </xsl:template>
    <xsl:template match="file" mode="filelist">
        <xsl:variable name="first">
            <xsl:call-template name="isfirst">
                <xsl:with-param name="name" select="@name"/>
            </xsl:call-template>
        </xsl:variable>
        <xsl:variable name="name" select="@name"/>

        <xsl:if test="$first = 'true'">
            <xsl:variable name="new-name">
                <xsl:call-template name="from-dos">
                    <xsl:with-param name="path" select="@name"/>
                </xsl:call-template>
            </xsl:variable>
            <tr>
                <xsl:call-template name="alternated-row"/>
                <td nowrap="nowrap">
                    <a>
                        <xsl:attribute name="href">
                            <xsl:text>files/</xsl:text>
                            <xsl:value-of select="$new-name"/>
                            <xsl:text>.html</xsl:text>
                        </xsl:attribute>
                        <xsl:value-of select="@name"/>
                    </a>
                </td>
                <td>
                    <xsl:value-of select="count(../file[@name = $name]/error)"/>
                </td>
            </tr>
        </xsl:if>
    </xsl:template>

    <xsl:template match="file" mode="all.classes">
        <xsl:variable name="first">
            <xsl:call-template name="isfirst">
                <xsl:with-param name="name" select="@name"/>
            </xsl:call-template>
        </xsl:variable>

        <xsl:if test="$first = 'true'">
            <xsl:variable name="new-name">
                <xsl:call-template name="from-dos">
                    <xsl:with-param name="path" select="@name"/>
                </xsl:call-template>
            </xsl:variable>
            <tr>
                <td nowrap="nowrap">
                    <a target="fileFrame">
                        <xsl:attribute name="href">
                            <xsl:text>files/</xsl:text>
                            <xsl:value-of select="$new-name"/>
                            <xsl:text>.html</xsl:text>
                        </xsl:attribute>
                        <xsl:value-of select="@name"/>
                    </a>
                </td>
            </tr>
        </xsl:if>
    </xsl:template>

    <!--
    transform string like a/b/c to ../../../
    @param path the path to transform into a descending directory path
    -->
    <xsl:template name="path">
        <xsl:param name="path"/>
        <xsl:if test="contains($path,'/')">
            <xsl:text>../</xsl:text>
            <xsl:call-template name="path">
                <xsl:with-param name="path">
                    <xsl:value-of select="substring-after($path,'/')"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:if>
        <xsl:if test="not(contains($path,'/')) and not($path = '')">
            <xsl:text>../</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template name="alternated-row">
        <xsl:attribute name="class">
            <xsl:if test="position() mod 2 = 1">a</xsl:if>
            <xsl:if test="position() mod 2 = 0">b</xsl:if>
        </xsl:attribute>
    </xsl:template>

    <!-- determine if this is the first occurance of the given name in the input -->
    <xsl:template name="isfirst">
        <xsl:param name="name"/>
        <xsl:value-of select="count(preceding-sibling::file[@name=$name]) = 0"/>
    </xsl:template>

</xsl:stylesheet>

